#ifndef THREAD_POOL_H
#define THREAD_POOL_H

#include <pthread.h>

// 任务结构体声明
// 以函数指针和参数作为每个任务的主要内容
typedef struct {
    void (*function)(void *); // 指向需要执行的函数
    void *arg;               // 函数的参数
} Task;

// 任务队列结构体声明
// 用于管理线程池中任务的充随进程
typedef struct {
    Task *tasks;              // 任务列表
    int capacity;            // 队列容量
    int size;                // 当前任务数量
    int head;                // 队首指针
    int tail;                // 队尾指针
    pthread_mutex_t lock;    // 互斥锁
    pthread_cond_t not_empty; // 队列不为空条件变量
    pthread_cond_t not_full;  // 队列不满条件变量
} TaskQueue;

// 线程池结构体声明
// 用于线程池的创建和运行
typedef struct {
    pthread_t *threads;      // 线程池中的线程列表
    TaskQueue *task_queue;   // 线程池使用的任务队列
    int thread_count;        // 线程总数
    int stop;                // 线程池是否停止的标志
} ThreadPool;

// 创建任务队列
TaskQueue *task_queue_create(int capacity);
// 销毁任务队列
void task_queue_destroy(TaskQueue *queue);
// 将任务插入队列
int task_queue_push(TaskQueue *queue, Task task);
// 从队列取出任务
int task_queue_pop(TaskQueue *queue, Task *task);

// 创建线程池
ThreadPool *thread_pool_create(int thread_count, int queue_capacity);
// 销毁线程池
void thread_pool_destroy(ThreadPool *pool);
// 举例化增加一个任务到线程池
int thread_pool_add_task(ThreadPool *pool, void (*function)(void *), void *arg);

#endif
